package com.html.blog.interceptor;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;

/**
 * Interceptor 是 JFinal AOP 的实现方式，通过实现 Interceptor 接口以及使用@Before annotation 可以细粒度地进行配置。
 * Interceptor 并非线程安全的，线程安全拦截器需要继承 PrototypeInterceptor 来实现。
 *
 * 拦截器配置共分三个级别：Global 级、Controller 级、Action 级。
 * Global 级的拦截器将对所有 Action 进行拦截，
 * Controller 级拦截器将对该 Controller 中所有 Action 进行拦截，
 * Action 级拦截器仅对该 Action 进行拦截。
 *
 * Global 级拦截器在 JFinalConfig.configInterceptor(Interceptors me)进行配置。
 * Controller 级拦截器使用@Before annotation放置在Controller类定义前进行配置。
 * Action 级拦截器使用@Before annotation 放置在 Action 定义前进行配置。
 *
 * ClearInterceptor 默认仅清除上一级别的拦截器。Action 级的上一级为 Controller 级，
 * Controller 级的上一级为 Global 级。如果需删除多级拦截器，可以为 ClearInterceptor 加入参数ClearLayer.ALL。
 *
 * BlogInterceptor
 */
public class BlogInterceptor implements Interceptor {

	/**
	 * ActionInvocation 作为 Interceptor 接口 intercept 方法中的唯一参数，
	 * 提供了很多便利的方法以便在拦截器中使用。
	 * void invoke()  继续本次调用，将调用剩下的拦截器与 Action
	 * Controller getController()  获取本次 Action 调用所属的 Controller
	 * String getActionKey()  获取本次 Action 调用的 action key 值
	 * String getControllerKey()  获取本次 Action 调用的 controller key 值
	 * Method getMethod()  获取本次 Action 调用的 Method 对象
	 * String getMethodName()  获取本次 Action 调用的 Method 对象的名称
	 * String getViewPath()  获取本次 Action 调用的视图路径
	 * @param invocation
	 */
	public void intercept(Invocation invocation) {
		System.out.println("Before invoking " + invocation.getActionKey());
		invocation.invoke();
		System.out.println("After invoking " + invocation.getActionKey());
	}

	/**
	 * InterceptorStack 可将多个拦截器组合成一个拦截器，
	 * 当需要对某一组拦截器重复配置使用的时候可以减少配置代码量：
	 * public class ManagerInterceptor extends InterceptorStack {
	 * 		public void config() {
	 * 			addInterceptors(new AuthInterceptor(), new DemoInterceptor());
	 * 		}
	 * }
	 *
	 * 以上代码将两个拦截器组合为了一个拦截器，组合后的拦截器与普通拦截器配置方法完全一样，
	 * 仍然为：@Before(ManagerInterceptor.class)
	 */
}
